package com.ming.service.impl;

import com.ming.enums.ErrorCode;
import com.ming.service.MonitoringService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.util.concurrent.atomic.AtomicLong;

/**
 * 监控服务实现
 * 提供基础的监控和告警功能
 *
 * @author ming
 * @version 1.0
 */
@Slf4j
@Service
public class MonitoringServiceImpl implements MonitoringService {

    @Value("${spring.profiles.active:default}")
    private String activeProfile;

    // 简单的内存计数器，生产环境建议使用专业的监控系统（如 Prometheus、Micrometer）
    private final AtomicLong exceptionCounter = new AtomicLong(0);
    private final AtomicLong requestCounter = new AtomicLong(0);
    private final AtomicLong alertCounter = new AtomicLong(0);

    @Override
    public void sendAlert(ErrorCode errorCode, String message) {
        alertCounter.incrementAndGet();

        String alertMessage = String.format("[%s] 系统告警 - 错误码: %d, 错误信息: %s",
                activeProfile.toUpperCase(), errorCode.getCode(), message);

        log.error("🚨 {}", alertMessage);

        // 这里可以扩展集成其他告警系统
        // 例如：钉钉、企业微信、邮件、短信等
        sendToAlertSystem(alertMessage);
    }

    @Override
    public void sendAlert(ErrorCode errorCode, String message, Throwable throwable) {
        alertCounter.incrementAndGet();

        String alertMessage = String.format("[%s] 系统告警 - 错误码: %d, 错误信息: %s, 异常类型: %s",
                activeProfile.toUpperCase(), errorCode.getCode(), message,
                throwable.getClass().getSimpleName());

        log.error("🚨 {}", alertMessage, throwable);

        // 这里可以扩展集成其他告警系统
        sendToAlertSystem(alertMessage);
    }

    @Override
    public void recordException(String exceptionType) {
        exceptionCounter.incrementAndGet();
        log.warn("异常指标记录 - 异常类型: {}, 总异常数: {}", exceptionType, exceptionCounter.get());

        // 这里可以集成监控系统记录指标
        // Metrics.counter("system.exception.count", "type", exceptionType).increment();
    }

    @Override
    public void recordException(String exceptionType, String... tags) {
        exceptionCounter.incrementAndGet();
        String tagStr = tags.length > 0 ? String.join(",", tags) : "none";
        log.warn("异常指标记录 - 异常类型: {}, 标签: {}, 总异常数: {}",
                exceptionType, tagStr, exceptionCounter.get());

        // 这里可以集成监控系统记录带标签的指标
        // Metrics.counter("system.exception.count", "type", exceptionType, "tags", tagStr).increment();
    }

    @Override
    public void recordResponseTime(String endpoint, long duration) {
        log.info("响应时间指标 - 接口: {}, 耗时: {}ms", endpoint, duration);

        // 这里可以集成监控系统记录响应时间
        // Metrics.timer("system.response.time", "endpoint", endpoint).record(duration, TimeUnit.MILLISECONDS);

        // 慢查询告警
        if (duration > 3000) { // 超过3秒
            sendAlert(ErrorCode.SERVICE_UNAVAILABLE,
                    String.format("接口响应过慢 - 接口: %s, 耗时: %dms", endpoint, duration));
        }
    }

    @Override
    public void recordRequest(String endpoint, int status) {
        requestCounter.incrementAndGet();
        log.info("请求指标记录 - 接口: {}, 状态码: {}, 总请求数: {}",
                endpoint, status, requestCounter.get());

        // 这里可以集成监控系统记录请求指标
        // Metrics.counter("system.request.count", "endpoint", endpoint, "status", String.valueOf(status)).increment();

        // 错误请求告警
        if (status >= 500) {
            sendAlert(ErrorCode.INTERNAL_SERVER_ERROR,
                    String.format("接口返回服务器错误 - 接口: %s, 状态码: %d", endpoint, status));
        }
    }

    @Override
    public void recordBusinessMetric(String metricName, double value, String... tags) {
        String tagStr = tags.length > 0 ? String.join(",", tags) : "none";
        log.info("业务指标记录 - 指标名称: {}, 指标值: {}, 标签: {}",
                metricName, value, tagStr);

        // 这里可以集成监控系统记录业务指标
        // Metrics.gauge("business." + metricName, value, "tags", tagStr);
    }

    /**
     * 发送到告警系统
     * 这里是示例实现，实际项目中需要根据使用的告警系统进行实现
     */
    private void sendToAlertSystem(String alertMessage) {
        // 只在生产环境发送告警
        if ("prod".equals(activeProfile)) {
            // 示例：发送到钉钉群
            // dingTalkAlertService.sendMessage(alertMessage);

            // 示例：发送到企业微信
            // wechatWorkAlertService.sendMessage(alertMessage);

            // 示例：发送邮件
            // emailAlertService.sendAlert(alertMessage);

            log.info("告警已发送到告警系统: {}", alertMessage);
        } else {
            log.debug("非生产环境，跳过告警发送: {}", alertMessage);
        }
    }

    /**
     * 获取监控统计信息
     */
    public String getMonitoringStats() {
        return String.format("监控统计 - 总异常数: %d, 总请求数: %d, 总告警数: %d",
                exceptionCounter.get(), requestCounter.get(), alertCounter.get());
    }
}